/**
 * @author 徐楠
 * @date 2022/3/10 8:02
 * @version 1.0
 */

package com.xunan.likou;

import java.util.Arrays;

public class HIndex {
    public static void main(String[] args) {
        int[] citations = {1, 3, 1};
        int i = hIndex(citations);
        System.out.println(i);
    }

    public static int hIndex(int[] citations) {
        Arrays.sort(citations);
        for (int citation : citations) {
            System.out.println(citation);
        }
        int N = citations.length;
        if (N == 0) return 0;
        if (N == 1) return Math.min(1, citations[0]);
        int result = 0;
        for (int i = N - 1; i >= 0; i--) {
            //总共有 h 篇论文
            int h = i;
            //其余的 n - h 篇论文
            int others = N - h;
            if (citations[i] >= others) {
                result = others;
            }
        }
        return result;


    }

    public int hIndex2(int[] citations) {
        //排序，从小到大
        Arrays.sort(citations);
        int N = citations.length;
        //h篇论文，0<h<=N
        for (int h = N; h > 0; h--) {
            // citations[len - h] >= h 意味着有 h 个数大于等于 h
            /*
            * 因为h是从N开始计数，故N - h是从0开始，因此citations[N - h]相当于是citations[0]，
            * 且citations经过排序后，citations[0]是最小值，所以做判断：h篇论文被至少引用h次，
            * 故只要其citations最小值大于h就可以返回h，否则citations的下标向后移动
            * （猜测的引用论文数量减少一篇，citations中最小值变大一次）
            * 如：citations = [3,0,6,1,5]，排序后：citations = [0,1,3,5,6]
            * 猜测初始时有h=5篇引用论文，其citations【0】=0 不大于h，for循环
            * 有h=4篇引用论文，其citations【1】=1 不大于h，继续做判断。。。。
            *
            * */
            if (citations[N - h] >= h) {
                return h;
            }
        }
        //上面都没返回说明h=0，没有引用论文
        return 0;
    }


}
